/* eslint-disable @typescript-eslint/no-unused-vars */
import { Controller, Get, Post, Body, Patch, Param, Delete, Inject, Query, BadRequestException } from '@nestjs/common';
import { UserService } from './user.service';
import { RegisterUserDto } from './dto/register-user.dto';
import { EmailService } from 'src/email/email.service';
import { RedisService } from 'src/redis/redis.service';
import { LoginUserDto } from './dto/login-user.dto';
import { JwtService } from '@nestjs/jwt';
import { RequireLogin, UserInfo } from 'src/custom.decorator';
import { UpdateUserPasswordDto } from './dto/update-user-password.dto';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }
  @Inject(EmailService)
  private emailService: EmailService;

  @Inject(RedisService)
  private redisService: RedisService;


  @Inject(JwtService)
  private jwtService: JwtService

  @Post('register')
  async register(@Body() registerUser: RegisterUserDto) {
    return await this.userService.register(registerUser);
  }

  @Get('register-captcha')
  async captcha(@Query('address') address: string) {
    // 生成验证码
    const code = Math.random().toString().slice(2, 8);

    /**
     * 验证码存储到 Redis 数据库中，
     * 键为 captcha_${address}，值为生成的验证码，
     * 并设置过期时间为 5 分钟。
     */
    await this.redisService.set(`captcha_${address}`, code, 5 * 60)

    await this.emailService.sendMail({
      to: address,
      subject: '注册验证码',
      html: `<p>来辣，你的验证码是${code}</p>`
    })
    return '发送成功'
  }

  @Post('login')
  async userLogin(@Body() loginUser: LoginUserDto) {
    /**
     * 当访问接口的时候，就返回一个新的 token。
     * 这样只要它在 token 过期之前，也就是 7 天内访问了一次系统，那就会刷新换成新 token。
     * 如果超过 7 天没访问，那就需要重新登录了。
     */
    const user = await this.userService.login(loginUser);
    return {
      user,
      token: this.jwtService.sign({
        userId: user.id,
        username: user.username
      }, {
        expiresIn: '7D'
      })
    };
  }


  @Get('info')
  @RequireLogin()
  async info(@UserInfo('userId') userId: number) {
    return this.userService.findUserDetailById(userId)
  }


  @Post('update')
  @RequireLogin()
  async update(@UserInfo('userId') userId: number, @Body() updateUserDto) {
    return await this.userService.update(userId, updateUserDto);
  }


  @Post('update_password')
  async updatePassword(@Body() passwordDto: UpdateUserPasswordDto) {
    return this.userService.updatePassword(passwordDto);
  }


  // 发送邮箱验证码

  // @Get('update/captcha')
  // @RequireLogin()
  // async updateCaptcha(@UserInfo('userId') userId: number) {
  //   const { email: address } = await this.userService.findUserDetailById(userId);

  //   const code = Math.random().toString().slice(2, 8);

  //   await this.redisService.set(`update_user_captcha_${address}`, code, 10 * 60);

  //   await this.emailService.sendMail({
  //     to: address,
  //     subject: '更改用户信息验证码',
  //     html: `<p>你的验证码是 ${code}</p>`
  //   });
  //   return '发送成功';
  // }

  @Get('update/captcha')
  async updateCaptcha(@Query('address') address: string) {
    if (!address) {
      throw new BadRequestException('邮箱地址不能为空');
    }
    const code = Math.random().toString().slice(2, 8);

    await this.redisService.set(`update_user_captcha_${address}`, code, 10 * 60);

    await this.emailService.sendMail({
      to: address,
      subject: '更改用户信息验证码',
      html: `<p>你的验证码是 ${code}</p>`
    });
    return '发送成功';
  }

  //8.10号，调试接口时一直报404,找了半天才发现是路径多打了一个  '/'


  @Get('update_password/captcha')
  async updatePasswordCaptcha(@Query('address') address: string) {
    if (!address) {
      throw new BadRequestException('邮箱地址不能为空');
    }
    const code = Math.random().toString().slice(2, 8);
    await this.redisService.set(`update_password_captcha_${address}`, code, 10 * 60);
    await this.emailService.sendMail({
      to: address,
      subject: '更改密码验证码',
      html: `<p>你的验证码是 ${code}</p>`
    });
    return '发送成功';
  }
}



/**
 * 2024.8.7
 * 实现修改密码，修改用户信息接口
 * user/info 用于回显用户信息
 * /user/update_password 用于修改密码
 * /user/update 用于修改用户信息
 *  /user/update/captcha 和 /user/update_password/captcha 用于发送验证码
 * /user/info 和 /user/update 接口需要登录，通过之前封装的 @UserInfo 装饰器从 request.user 取用户信息。
 * 至此，用户模块的功能完成。
 */